<?php

namespace App\Http\Controllers\Edu;

use App\Http\Controllers\Controller;
use App\Models\EduCategory;
use App\Models\EduTopic;
use App\Policies\EduTopicPolicy;
use Illuminate\Http\Request;
use Spatie\Activitylog\Models\Activity;

class TopicController extends Controller
{
    public function __construct()
    {
        //调用auth这个中间件,当访问这个控制器中的方法的时候会进行auth认证看是否登陆,如果没有登陆访问这个控制器中方法的动作就会被阻止.
        //在这个控制器中有多个方法,其中除了index和show方法之外的方法需要验证,所以可以给这个控制器的中间件加except选项参数
        $this->middleware('auth', ['except' => ['index', 'show']]);
    }

    public function index()
    {
//        dd(Activity::all()->last());
//  dd(EduTopic::search($request->query('ss'))->get());
        //从帖子表中按照时间排序,将里面的数据以分页每页8条记录的形式取出
        $topics = EduTopic::latest()->paginate(8);
        return view('edu.topic.index', compact('topics'));
    }

    public function create(EduTopic $topic)
    {
        //create创建和edit比较类似经常公用一个模板视图,但是edit编辑的时候需要将原来的旧数据一并传入到要渲染的视图中
        //create创建并没有旧数据,所以并不需要传递$topic对象
        //这里之所以要传递$topic这个空的EduTopic模型对象仅仅是为了保证和edit方法传递相同的参数给edu.topic.create这个视图模板
        $categories = EduCategory::get();
        return view('edu.topic.create', compact('topic', 'categories'));
    }

    public function store(Request $request, EduTopic $topic)
    {
//        这里$request中存放的是用户表单中填写提交过来的内容,
        //刚开始$topic只是一个实例化出来的EduTopic空对象
        //将当前登陆用户的id添加到$topic这个空的EduTopic对象中
//        $topic['user_id'] = auth()->id();
        //也可以使用fill方法向对象中填充属性
//        $topic->fill($request->all());
        //修改过模型对象的属性后,要将这些属性保存到相应的数据表中要使用save,而不能使用create
//       $topic->save();

        //      也可以使用create方法往后台数据表中新增数据
        $request = $request->toArray();
        $request['user_id'] = auth()->id();
        //使用$topic模型对象的create()方法往数据库中新增数据后,默认会将新创建的那条数据对象返回
        $topic = $topic->create($request);
        return redirect(route('edu.topic.show', $topic))->with('success', '帖子发表成功asd');
    }

    public function show(EduTopic $topic)
    {
//        渲染show视图,并将$topic帖子对象传递到前台页面中
        return view('edu.topic.show', compact('topic'));
    }

    public function edit(EduTopic $topic)
    {
        //Laravel 也为继承 App\Http\Controllers\Controller 这个基类的控制器提供了一个有用的 authorize 方法。和 can 方法类似，这个方法需要接收你想授权的动作和相关的模型作为参数。如果这个动作没有被授权， authorize 方法会抛出一个 Illuminate\Auth\Access\AuthorizationException 的异常，然后 Laravel 默认的异常处理器会将这个异常转化成带有 403 状态码的 HTTP 响应。
         //调用当前对象的authorize()
        $this->authorize('update', $topic);
        //policy 模型策略  模型权限
//        if(auth()->id() != $topic['user_id']){
//            return redirect(route('edu.topic.manager'))->with('error','不是你的文章');
//        }
        $categories = EduCategory::get();
        return view('edu.topic.edit', compact('categories', 'topic'));
    }

    public function update(Request $request, EduTopic $topic)
    {
        $topic->update($request->all());
        return redirect(route('edu.topic.manager'))->with('success', '修改成功');
    }

    public function destroy(EduTopic $topic)
    {
        $this->authorize('delete', $topic);
        $topic->delete();
        $history = session('url.intended');
        return $history ? redirect($history)->with('success', '删除成功') : redirect(route('edu.topic.index'))->with('success', '删除成功');
//        dd([session('url.intended'),session()->get('url.intended')]);
    }

    //会员中心帖子管理的方法
    public function manager(Request $request)
    {
        //将当前request请求的url地址存储到session中的flash闪存中
        session()->flash('url.intended', $request->fullUrl());
        $topics = EduTopic::where('user_id', auth()->id())->latest()->paginate(5);
        return view('edu.topic.manage', compact('topics'));
    }
    //用户搜索帖子展示的方法
    public function search(Request $request){
        //获取用户通过前台表单传递过来的用来搜索匹配的数据
        $topics = EduTopic::search($request->input('search'))->paginate(5);
        //将查询的结果传递到search结果展示视图模板中
        return view('edu.topic.search',compact('topics'));
    }



}
